package cn.cdeden.resource.unified.service;


import cn.cdeden.common.core.domain.R;
import cn.cdeden.resource.api.domain.RemoteFile;
import cn.cdeden.resource.api.domain.RemoteFilesDownload;
import cn.cdeden.resource.domain.vo.SysOssVo;
import cn.cdeden.resource.unified.domain.dto.FilesCoverUploadDto;
import cn.cdeden.resource.unified.domain.dto.FilesUploadDto;
import cn.cdeden.resource.unified.domain.dto.OnlinePreviewInfoDto;
import cn.cdeden.resource.unified.domain.dto.SliceFileUploadDto;
import cn.cdeden.system.api.model.LoginUser;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotNull;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

import java.io.IOException;
import java.util.List;

/**
 * @ProjectName : KnowCore01
 * @Package : cn.cdeden.resource.unified.service
 * @ClassName : UploadFileService
 * @Author : Yu.
 * @Description : // TODO
 * @Date : 2024/12/24 15:17
 * @Version : 1.0
 */
public interface UnifiedFileUploadService {

    /**
     * 单文件上传
     *
     * @param uploadDto
     * @return cn.cdeden.common.core.domain.R
     * @author Yu.
     * @Date 2024/12/5 13:40
     **/
    R upload(FilesUploadDto uploadDto);


    /**
     * 文件的上传接口
     * @author Yu.
     * @Date 2025/2/7 10:52
     * @param uploadDto
     * @return cn.cdeden.common.core.domain.R
     **/
    R uploadCoverImage(FilesCoverUploadDto uploadDto);


    /**
     * 创建分片信息
     *
     * @param uploadDto
     * @return cn.cdeden.common.core.domain.R
     * @author Yu.
     * @Date 2024/12/5 13:40
     **/
    R createMultipartUpload(@Validated @ModelAttribute SliceFileUploadDto uploadDto);



    /**
     * 上传分片文件
     *
     * @param uploadDto
     * @return cn.cdeden.common.core.domain.R
     * @author Yu.
     * @Date 2024/12/22 17:06
     **/
    R uploadSlice(@Validated @ModelAttribute SliceFileUploadDto uploadDto);


//    /**
//     * 下载文件到服务中 并解药
//     * @author Yu.
//     * @Date 2024/12/23 15:40
//     * @param ossId 文件的编号
//     * @return java.lang.String
//     **/
//    String zipFile(Long ossId);







    /**
     * 中止分片文件上传
     *
     * @param userInfo 操作的用户
     * @param sliceId  分片上传的ID
     * @return java.lang.Boolean
     * @author Yu.
     * @Date 2024/12/22 16:37
     **/
    Boolean abortSliceFileUpload(LoginUser userInfo, @NotNull String sliceId);



    /**
     * // 移动文件 到其他库中去位置
     *
     * @param ossId      文件的编号
     * @param versionId  文件的版本
     * @param bucketName 移动文件位置
     * @return cn.cdeden.resource.domain.vo.SysOssVo
     * @author Yu.
     * @Date 2024/12/6 11:31
     **/
    SysOssVo movePosition(Long ossId, String versionId, String bucketName);



    /**
     * // 复制文件到其他库中去位置
     *
     * @param ossId      上传的文件编号
     * @param versionId  文件版本
     * @param bucketName 移动文件位置
     * @return cn.cdeden.resource.domain.vo.SysOssVo
     * @author Yu.
     * @Date 2024/12/6 11:31
     **/
    SysOssVo copyFile(Long ossId, String versionId, String bucketName);



    /**
     * 下载文件
     *
     * @param downloads
     * @param moduleType
     * @param request
     * @param response
     * @return void
     * @author Yu.
     * @Date 2024/12/6 17:01
     **/
    void download(List<RemoteFilesDownload> downloads, String moduleType, HttpServletRequest request, HttpServletResponse response) throws IOException;


    /**
     * 文件打印
     * 文件转成 pdf 流方式返回前端
     *
     * @param printFileDto
     * @return void
     * @Date 2024/12/12 17:16
     **/
    void convertPdf(RemoteFile fileDataInfo, OnlinePreviewInfoDto printFileDto, HttpServletResponse response);



}
